﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Entidades.Reclamos;
using System.Data;
using Datos.Reclamos.Common;
using Datos.Reclamos.DAL;

namespace Datos.Reclamos
{
    public class RecHojaReclamacionDAL : ConexionBD, IRecHojaReclamacionDAL
    {
        #region ATRIBUTOS       
        
        private SqlCommand cmd;

        #endregion

        #region METODOS PARA LOS LIBROS DE RECLAMACIONES

        public List<RecLibro> listarLibros()
        {
            List<RecLibro> lista = new List<RecLibro>();
            RecLibro be;

            cmd = new SqlCommand();
            cmd.Connection = getConnection();
            cmd.CommandText = "sp_Rec_ListarLibro";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();
            
            try
            {
                cmd.Connection.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        be = new RecLibro();
                        be.IdLibro = dr.GetInt32(dr.GetOrdinal("idLibro"));
                        be.Descripcion = dr.GetString(dr.GetOrdinal("descripcion"));  
                        lista.Add(be);
                    }
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Connection.Close();
                cmd.Connection.Dispose();
                cmd.Dispose();
            }
            return lista;
        }

        #endregion

        #region METODOS PARA LOS PRODUCTOS / SERVICIOS OFRECIDOS

        public List<RecTipoBienContratado> listarBienes()
        {
            List<RecTipoBienContratado> lista = new List<RecTipoBienContratado>();
            RecTipoBienContratado be;

            cmd = new SqlCommand();
            cmd.Connection = getConnection();
            cmd.CommandText = "sp_Rec_ListarBienes";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();

            try
            {
                cmd.Connection.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        be = new RecTipoBienContratado();
                        be.IdTipoBien = dr.GetInt32(dr.GetOrdinal("idTipoBien"));
                        be.Descripcion = dr.GetString(dr.GetOrdinal("descripcion"));
                        lista.Add(be);
                    }
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Connection.Close();
                cmd.Connection.Dispose();
                cmd.Dispose();
            }
            return lista;
        }

        #endregion


        #region METODOS PARA LAS HOJAS DE RECLAMACIONES

        public int insertar(RecHojaReclamacion hoja)
        {
            
            int codInsertado = 0;

            cmd = new SqlCommand();
            cmd.Connection = getConnection();
            cmd.CommandText = "sp_Rec_InsertarHojaReclamacion";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();

            cmd.Parameters.Add("@pIdLibro", SqlDbType.Int, 11).Value = hoja.Libro.IdLibro;
            cmd.Parameters.Add("@pCodHoja", SqlDbType.VarChar, 10).Value = hoja.CodHoja;            
            cmd.Parameters.Add("@pFecReclamo", SqlDbType.DateTime).Value = hoja.FecReclamo;
            cmd.Parameters.Add("@pNomConsumidor", SqlDbType.VarChar, 300).Value = hoja.NomConsumidor;
            cmd.Parameters.Add("@pNumDni", SqlDbType.VarChar, 11).Value = hoja.NumDNI;
            cmd.Parameters.Add("@pNumTelefono", SqlDbType.VarChar, 100).Value = hoja.NumTelefono;
            cmd.Parameters.Add("@pDomConsumidor", SqlDbType.VarChar, 300).Value = hoja.DomConsumidor;
            cmd.Parameters.Add("@pNomApoderador", SqlDbType.VarChar, 350).Value = hoja.NomApoderador;
            cmd.Parameters.Add("@pIdTipoReclamo", SqlDbType.Int, 11).Value = hoja.Reclamo.IdTipoReclamo;
            cmd.Parameters.Add("@pDetReclamo", SqlDbType.VarChar, 1000).Value = hoja.DetReclamo;
            cmd.Parameters.Add("@pDetAcciones", SqlDbType.VarChar, 2000).Value = hoja.DetAcciones;
            cmd.Parameters.Add("@pIdTipoBien", SqlDbType.Int, 11).Value = hoja.TipoBien.IdTipoBien;           
            cmd.Parameters.Add("@pDetBienContratado", SqlDbType.VarChar, 600).Value = hoja.DetBienContratado;

            try
            {
                cmd.Connection.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        codInsertado = Convert.ToInt32(dr["resultado"]);
                    }
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
               cmd.Connection.Close();
               cmd.Connection.Dispose();
               cmd.Dispose();              
            }
            return codInsertado;
        }

        public int actualizar(RecHojaReclamacion hoja)
        {
            int codInsertado = 0;
            cmd = new SqlCommand();
            cmd.Connection = getConnection();
            cmd.CommandText = "sp_Rec_ActualizarHojaReclamacion";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();

            cmd.Parameters.Add("@pIdHoja", SqlDbType.Int, 11).Value = hoja.IdHoja;
            cmd.Parameters.Add("@pIdLibro", SqlDbType.Int, 11).Value = hoja.Libro.IdLibro;
            cmd.Parameters.Add("@pCodHoja", SqlDbType.VarChar, 10).Value = hoja.CodHoja;
            cmd.Parameters.Add("@pFecReclamo", SqlDbType.DateTime).Value = hoja.FecReclamo;
            cmd.Parameters.Add("@pNomConsumidor", SqlDbType.VarChar, 300).Value = hoja.NomConsumidor;
            cmd.Parameters.Add("@pNumDni", SqlDbType.VarChar, 11).Value = hoja.NumDNI;
            cmd.Parameters.Add("@pNumTelefono", SqlDbType.VarChar, 100).Value = hoja.NumTelefono;
            cmd.Parameters.Add("@pDomConsumidor", SqlDbType.VarChar, 300).Value = hoja.DomConsumidor;
            cmd.Parameters.Add("@pNomApoderador", SqlDbType.VarChar, 350).Value = hoja.NomApoderador;
            cmd.Parameters.Add("@pIdTipoReclamo", SqlDbType.Int, 11).Value = hoja.Reclamo.IdTipoReclamo;
            cmd.Parameters.Add("@pDetReclamo", SqlDbType.VarChar, 1000).Value = hoja.DetReclamo;
            cmd.Parameters.Add("@pDetAcciones", SqlDbType.VarChar, 2000).Value = hoja.DetAcciones;
            cmd.Parameters.Add("@pIdTipoBien", SqlDbType.Int, 11).Value = hoja.TipoBien.IdTipoBien;
            cmd.Parameters.Add("@pDetBienContratado", SqlDbType.VarChar, 600).Value = hoja.DetBienContratado;

            try
            {
                cmd.Connection.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        codInsertado = Convert.ToInt32(dr["resultado"]);
                    }
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Connection.Close();
                cmd.Connection.Dispose();
                cmd.Dispose(); 
            }
            return codInsertado;
        }

        public RecHojaReclamacion obtener(int idHoja)
        {
            RecHojaReclamacion be = new RecHojaReclamacion();
            cmd = new SqlCommand();
            cmd.Connection = getConnection();
            cmd.CommandText = "sp_Rec_ObtenerHojaReclamacion";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();

            cmd.Parameters.Add("@pIdHoja", SqlDbType.Int, 11).Value = idHoja;

            try
            {
                cmd.Connection.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        be = new RecHojaReclamacion();
                        be.IdHoja = idHoja;
                        be.Libro.IdLibro = dr.GetInt32(dr.GetOrdinal("idLibro"));
                        be.CodHoja = dr.GetString(dr.GetOrdinal("codHoja"));
                        be.FecReclamo = dr.GetDateTime(dr.GetOrdinal("fecReclamo"));
                        be.NomConsumidor = dr.GetString(dr.GetOrdinal("nomConsumidor"));
                        be.NumDNI = dr.GetString(dr.GetOrdinal("numDni"));
                        be.NumTelefono = dr.GetString(dr.GetOrdinal("numTelefono"));
                        be.DomConsumidor = dr.GetString(dr.GetOrdinal("domConsumidor"));
                        be.NomApoderador = dr.GetString(dr.GetOrdinal("nomApoderador"));
                        be.Reclamo.IdTipoReclamo = dr.GetInt32(dr.GetOrdinal("idTipoReclamo"));
                        be.DetReclamo = dr.GetString(dr.GetOrdinal("detReclamo"));
                        be.DetAcciones = dr.GetString(dr.GetOrdinal("detAcciones"));
                        be.TipoBien.IdTipoBien = dr.GetInt32(dr.GetOrdinal("idTipoBien"));                        
                        be.DetBienContratado = dr.GetString(dr.GetOrdinal("detBienContratado"));
                    }
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Connection.Close();
                cmd.Connection.Dispose();
                cmd.Dispose(); 
            }
            return be;
        }

        public List<RecHojaReclamacion> listar(RecHojaReclamacion hoja)
        {
            List<RecHojaReclamacion> lista = new List<RecHojaReclamacion>();
            RecHojaReclamacion be;
            cmd = new SqlCommand();
            cmd.Connection = getConnection();
            cmd.CommandText = "sp_Rec_ListarHojaReclamacion";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();

            cmd.Parameters.Add("@pFecInicio", SqlDbType.DateTime).Value = hoja.FecReclamo;
            cmd.Parameters.Add("@pFlInicio", SqlDbType.Bit,1).Value = hoja.FlReclamo;
            cmd.Parameters.Add("@pFecFin", SqlDbType.DateTime).Value = hoja.FecReclamoFin;
            cmd.Parameters.Add("@pFlFin", SqlDbType.Bit,1).Value = hoja.FlReclamoFin;
            cmd.Parameters.Add("@pNomConsumidor", SqlDbType.VarChar, 300).Value = hoja.NomConsumidor;
            cmd.Parameters.Add("@pNumDni", SqlDbType.VarChar, 11).Value = hoja.NumDNI;
            cmd.Parameters.Add("@pNumTelefono", SqlDbType.VarChar, 100).Value = hoja.NumTelefono;

            try
            {
                cmd.Connection.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {                                                                 
                        be = new RecHojaReclamacion();
                        be.IdHoja = dr.GetInt32(dr.GetOrdinal("idHoja"));
                        be.Libro.IdLibro = dr.GetInt32(dr.GetOrdinal("idLibro"));
                        be.Libro.Descripcion = dr.GetString(dr.GetOrdinal("libro"));
                        be.Libro.Local.Nombre = dr.GetString(dr.GetOrdinal("local"));
                        be.Reclamo.IdTipoReclamo = dr.GetInt32(dr.GetOrdinal("idTipoReclamo"));
                        be.Reclamo.Descripcion = dr.GetString(dr.GetOrdinal("reclamo"));
                        be.CodHoja = dr.GetString(dr.GetOrdinal("codHoja"));
                        be.FecReclamo = dr.GetDateTime(dr.GetOrdinal("fecReclamo"));
                        be.NomConsumidor = dr.GetString(dr.GetOrdinal("nomConsumidor"));
                        be.NumDNI = dr.GetString(dr.GetOrdinal("numDni"));
                        be.NumTelefono = dr.GetString(dr.GetOrdinal("numTelefono"));
                        be.DomConsumidor = dr.GetString(dr.GetOrdinal("domConsumidor"));
                        be.NomApoderador = dr.GetString(dr.GetOrdinal("nomApoderador"));                        
                        be.DetReclamo = dr.GetString(dr.GetOrdinal("detReclamo"));
                        be.DetAcciones = dr.GetString(dr.GetOrdinal("detAcciones"));
                        be.TipoBien.IdTipoBien = dr.GetInt32(dr.GetOrdinal("idTipoBien"));
                        be.TipoBien.Descripcion = dr.GetString(dr.GetOrdinal("Bien"));
                        be.DetBienContratado = dr.GetString(dr.GetOrdinal("detBienContratado"));

                        lista.Add(be);
                    }
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Connection.Close();
                cmd.Connection.Dispose();
                cmd.Dispose();
            }
            return lista;
        }

        public int eliminar(int codigo)
        {
            int resultado = 0;
            cmd = new SqlCommand();
            cmd.Connection = getConnection();
            cmd.CommandText = "sp_Rec_EliminarHoja";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();

            cmd.Parameters.Add("@pIdHoja", SqlDbType.Int, 11).Value = codigo;

            try
            {
                cmd.Connection.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        resultado = dr.GetInt32(dr.GetOrdinal("resultado"));
                    }
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Connection.Close();
                cmd.Connection.Dispose();
                cmd.Dispose();
            }
            return resultado;
        }

        public int obtenerNumHoja()
        {
            int resultado = 0;
            cmd = new SqlCommand();
            cmd.Connection = getConnection();
            cmd.CommandText = "sp_Rec_ObtenerNumHoja";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();            

            try
            {
                cmd.Connection.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        resultado = dr.GetInt32(dr.GetOrdinal("resultado"));
                    }
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Connection.Close();
                cmd.Connection.Dispose();
                cmd.Dispose();
            }
            return resultado;
        }

        public List<RecHojaReclamacion> listarPendientes(RecHojaReclamacion hoja)
        {
            List<RecHojaReclamacion> lista = new List<RecHojaReclamacion>();
            RecHojaReclamacion be;
            cmd = new SqlCommand();
            cmd.Connection = getConnection();
            cmd.CommandText = "sp_Rec_ListarHojaReclamacionPendientes";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();

            cmd.Parameters.Add("@pFecInicio", SqlDbType.DateTime).Value = hoja.FecReclamo;
            cmd.Parameters.Add("@pFlInicio", SqlDbType.Bit, 1).Value = hoja.FlReclamo;
            cmd.Parameters.Add("@pFecFin", SqlDbType.DateTime).Value = hoja.FecReclamoFin;
            cmd.Parameters.Add("@pFlFin", SqlDbType.Bit, 1).Value = hoja.FlReclamoFin;
            cmd.Parameters.Add("@pNomConsumidor", SqlDbType.VarChar, 300).Value = hoja.NomConsumidor;
            cmd.Parameters.Add("@pNumTipoBien", SqlDbType.Int).Value = hoja.TipoBien.IdTipoBien;
            cmd.Parameters.Add("@pNumero", SqlDbType.VarChar, 100).Value = hoja.IdHoja;

            try
            {
                cmd.Connection.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        be = new RecHojaReclamacion();
                        be.IdHoja = dr.GetInt32(dr.GetOrdinal("idHoja"));
                        be.Libro.IdLibro = dr.GetInt32(dr.GetOrdinal("idLibro"));
                        be.Libro.Descripcion = dr.GetString(dr.GetOrdinal("libro"));
                        be.Libro.Local.Nombre = dr.GetString(dr.GetOrdinal("local"));
                        be.Reclamo.IdTipoReclamo = dr.GetInt32(dr.GetOrdinal("idTipoReclamo"));
                        be.Reclamo.Descripcion = dr.GetString(dr.GetOrdinal("reclamo"));
                        be.CodHoja = dr.GetString(dr.GetOrdinal("codHoja"));
                        be.FecReclamo = dr.GetDateTime(dr.GetOrdinal("fecReclamo"));
                        be.NomConsumidor = dr.GetString(dr.GetOrdinal("nomConsumidor"));
                        be.NumDNI = dr.GetString(dr.GetOrdinal("numDni"));
                        be.NumTelefono = dr.GetString(dr.GetOrdinal("numTelefono"));
                        be.DomConsumidor = dr.GetString(dr.GetOrdinal("domConsumidor"));
                        be.NomApoderador = dr.GetString(dr.GetOrdinal("nomApoderador"));
                        be.DetReclamo = dr.GetString(dr.GetOrdinal("detReclamo"));
                        be.DetAcciones = dr.GetString(dr.GetOrdinal("detAcciones"));
                        be.TipoBien.IdTipoBien = dr.GetInt32(dr.GetOrdinal("idTipoBien"));
                        be.TipoBien.Descripcion = dr.GetString(dr.GetOrdinal("Bien"));
                        be.DetBienContratado = dr.GetString(dr.GetOrdinal("detBienContratado"));

                        lista.Add(be);
                    }
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Connection.Close();
                cmd.Connection.Dispose();
                cmd.Dispose();
            }
            return lista;
        }

        #endregion

    }
}